package BaseDeDatos;

import java.io.File;
import java.io.FileNotFoundException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import Clases.MateriaPrima;
import Clases.Orden;
import Clases.Paso;
import Clases.Producto;

public class DBProductos {
	private final String FILE_NAME = "archivos//Pasos.txt";
	
	public DBProductos() throws ClassNotFoundException {
		Class.forName("com.mysql.jdbc.Driver");
	}

	public List<Producto> getProductos() throws SQLException {
		Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/usal", "root", "");
		
		CallableStatement call = (CallableStatement) con.prepareCall("{call select_productos()}");
		
		ResultSet productosDB = call.executeQuery();
		
		List<Producto> productoList = new ArrayList<Producto>();
		
		while (productosDB.next()) {
			Producto p = new Producto(Integer.parseInt(productosDB.getString(1)), productosDB.getString(2));
			productoList.add(p);
		}
		
		con.close();
		
		return productoList;
	}
	
	public Producto getProducto(int id) throws SQLException {
//		Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/usal", "root", "");
//		
//		CallableStatement call = (CallableStatement) con.prepareCall("{call select_productos()}");
//		
//		ResultSet productosDB = call.executeQuery();
		
		List<Producto> productoList = this.getProductos();
		
//		while (productosDB.next()) {
//			Producto p = new Producto(Integer.parseInt(productosDB.getString(1)), productosDB.getString(2));
//			productoList.add(p);
//		}
//		
//		con.close();
		
		for (Producto p : productoList) {
			if (p.getID() == id) {
				return p;
			}
		}
		
		return null;
	}

	public List<MateriaPrima> getMateriasPrimas() throws SQLException {
		Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/usal", "root", "");
		
		CallableStatement call = (CallableStatement) con.prepareCall("{call select_materias_primas()}");
		
		ResultSet materiasPrimasDB = call.executeQuery();
		
		List<MateriaPrima> materiaPrimaList = new ArrayList<MateriaPrima>();
		
		while (materiasPrimasDB.next()) {
			MateriaPrima mp = new MateriaPrima(Integer.parseInt(materiasPrimasDB.getString(1)));
			mp.setNombre(materiasPrimasDB.getString(2));
			mp.setCantidad(Integer.parseInt(materiasPrimasDB.getString(3)));

			
			materiaPrimaList.add(mp);
		}
		
		con.close();
		
		return materiaPrimaList;		
	}

	public List<Paso> getPasos(Integer producto_id) {
		File f = new File(this.FILE_NAME);
		
		List<Paso> pasoList = new ArrayList<Paso>();
		
		Scanner s = null;
		try {
			s = new Scanner(f);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		
		while (s.hasNext()) {
			String[] linea = s.nextLine().split(",");
			
			Integer prod_id = Integer.valueOf(linea[0]);
			
			if (prod_id.equals(producto_id)) {
				Paso p = new Paso();
				p.setDescripcion(linea[1]);
				p.setEstado(Paso.ESTADO_CREADO);
				
				if (linea.length > 2) {
					MateriaPrima mp = new MateriaPrima(Integer.valueOf(linea[2]));
					mp.setCantidad(Integer.valueOf(linea[3]));
					p.setMateriaPrima(mp);
				}
				
				pasoList.add(p);
			}
		}
		
		s.close();

		return pasoList;				
	}

	public List<Paso> getPasos(Orden o) throws SQLException {
		Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/usal", "root", "");
		
		CallableStatement call = (CallableStatement) con.prepareCall("{call select_orden_pasos(?)}");
		call.setString(1, o.getID());
		
		ResultSet pasosDB = call.executeQuery();
		
		List<Paso> pasoList = new ArrayList<Paso>();
		
		while (pasosDB.next()) {
			Paso p = new Paso();
			
			p.setId(pasosDB.getInt(1));
			
			try {
				p.setUsuario(new DBUsuarios().getUsuario(Integer.parseInt(pasosDB.getString(2))));
			} catch (NumberFormatException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
			
			p.setEstado(pasosDB.getString(3));
			p.setDescripcion(pasosDB.getString(4));
			
			String mpID = pasosDB.getString(5);
			
			if (mpID != null) {
				MateriaPrima mp = this.getMateriaPrima(Integer.parseInt(mpID));
				mp.setCantidad(Integer.parseInt(pasosDB.getString(6)));
				p.setMateriaPrima(mp);
			}
			
			String ff = pasosDB.getString(7);

			if (ff != null) {
				p.setFechaFinalizacion(ff);
			}
			
			pasoList.add(p);
		}
		
		con.close();
		
		return pasoList;			
	}

	public MateriaPrima getMateriaPrima(Integer id) {
		List<MateriaPrima> mpList = null;
		try {
			mpList = this.getMateriasPrimas();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		for (int i = 0; i < mpList.size(); i++) {
			if (mpList.get(i).getId().equals(id)) {
				return mpList.get(i);
			}
		}
		
		return null;
	}
	
	public Integer getStock(int mpID) throws SQLException {
		Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/usal", "root", "");
		
		CallableStatement call = (CallableStatement) con.prepareCall("{call select_materia_prima_stock(?,?)}");
		call.setInt(1, mpID);
		call.registerOutParameter(2, Types.INTEGER);
		
		call.executeQuery();
		
		Integer stock = call.getInt(2);
		
		con.close();
		
		return stock;
	}
	
	public void updateStock(MateriaPrima mp) throws SQLException {
		Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/usal", "root", "");
		
		CallableStatement call = (CallableStatement) con.prepareCall("{call update_materia_prima_stock(?,?)}");
		call.setInt(1, mp.getId());
		call.setInt(2, mp.getCantidad());
		
		call.executeQuery();
		
		con.close();
	}
}
